package com.android.tio.client;

import com.android.tio.client.intf.TioClientHandler;
import com.android.tio.client.intf.TioClientListener;
import com.android.tio.core.ChannelContext;
import com.android.tio.core.TioConfig;
import com.android.tio.core.intf.TioHandler;
import com.android.tio.core.intf.TioListener;
import com.android.tio.core.ssl.SslConfig;
import com.android.tio.utils.lock.SetWithLock;
import com.android.tio.utils.thread.pool.SynThreadPoolExecutor;

import java.util.HashSet;
import java.util.concurrent.ThreadPoolExecutor;


public class TioClientConfig extends TioConfig {
    private TioClientHandler tioClientHandler = null;

    private TioClientListener tioClientListener = null;

    protected ReconnConf reconnConf;//重连配置

    private ConnectionCompletionHandler connectionCompletionHandler = new ConnectionCompletionHandler();

    public final SetWithLock<ChannelContext> connecteds = new SetWithLock<ChannelContext>(new HashSet<ChannelContext>());
    public final SetWithLock<ChannelContext> closeds = new SetWithLock<ChannelContext>(new HashSet<ChannelContext>());

    /**
     * 不重连
     *
     * @param tioHandler
     * @param tioListener
     * @author tanyaowu
     */
    public TioClientConfig(TioClientHandler tioHandler, TioClientListener tioListener) {
        this(tioHandler, tioListener, null);
    }

    /**
     * @param tioHandler
     * @param tioListener
     * @param reconnConf  不用框架自动重连，就传null
     */
    public TioClientConfig(TioClientHandler tioHandler, TioClientListener tioListener, ReconnConf reconnConf) {
        this(tioHandler, tioListener, reconnConf, null, null);
    }

    /**
     * @param tioHandler
     * @param tioListener
     * @param reconnConf    不用框架自动重连，就传null
     * @param tioExecutor
     * @param groupExecutor
     */
    public TioClientConfig(TioClientHandler tioHandler, TioClientListener tioListener, ReconnConf reconnConf, SynThreadPoolExecutor tioExecutor,
                           ThreadPoolExecutor groupExecutor) {
        super(tioExecutor, groupExecutor);
        this.groupStat = new ClientGroupStat();
        this.setTioClientHandler(tioHandler);
        this.setTioClientListener(tioListener);

        this.reconnConf = reconnConf;
    }

    /**
     * 使用ssl访问
     *
     * @throws Exception
     * @author tanyaowu
     */
    public void useSsl() throws Exception {
        SslConfig sslConfig = SslConfig.forClient();
        setSslConfig(sslConfig);
    }

    /**
     * @return
     * @author tanyaowu
     * 2016年12月20日 上午11:33:46
     */
    @Override
    public TioHandler getTioHandler() {
        return this.getTioClientHandler();
    }

    /**
     * @return
     * @author tanyaowu
     * 2016年12月20日 上午11:33:46
     */
    @Override
    public TioListener getTioListener() {
        return this.getTioClientListener();
    }

    /**
     * @return the tioClientHandler
     */
    public TioClientHandler getTioClientHandler() {
        return tioClientHandler;
    }

    /**
     * @return the tioClientListener
     */
    public TioClientListener getTioClientListener() {
        return tioClientListener;
    }

    /**
     * @return the connectionCompletionHandler
     */
    public ConnectionCompletionHandler getConnectionCompletionHandler() {
        return connectionCompletionHandler;
    }

    /**
     * @param tioClientHandler the tioClientHandler to set
     */
    public void setTioClientHandler(TioClientHandler tioClientHandler) {
        this.tioClientHandler = tioClientHandler;
    }

    /**
     * @param tioClientListener the tioClientListener to set
     */
    public void setTioClientListener(TioClientListener tioClientListener) {
        this.tioClientListener = tioClientListener;
        if (this.tioClientListener == null) {
            this.tioClientListener = new DefaultTioClientListener();
        }
    }

    /**
     * @param connectionCompletionHandler the connectionCompletionHandler to set
     */
    public void setConnectionCompletionHandler(ConnectionCompletionHandler connectionCompletionHandler) {
        this.connectionCompletionHandler = connectionCompletionHandler;
    }

    /**
     * @param reconnConf the reconnConf to set
     */
    public void setReconnConf(ReconnConf reconnConf) {
        this.reconnConf = reconnConf;
    }

    /**
     * @return
     * @author tanyaowu
     */
    public ReconnConf getReconnConf() {
        return reconnConf;
    }

    /**
     * @return
     * @author tanyaowu
     */
    @Override
    public boolean isServer() {
        return false;
    }

    @Override
    public String toString() {
        return "TioClientConfig [name=" + name + "]";
    }
}
